package org.dxy.trigger.http;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dxy.api.dto.request.*;
import org.dxy.api.dto.response.OptionDto;
import org.dxy.api.dto.response.RouteProcessDTO;
import org.dxy.api.dto.response.R;
import org.dxy.infrastructure.persistent.po.query.RouteViewPo;

import java.util.List;
import org.dxy.trigger.http.service.impl.RouteApplicationServiceImpl;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequestMapping("/api/routes")
@RequiredArgsConstructor
public class RouteController {
    private final RouteApplicationServiceImpl routeApplicationService;

    /**
     * @description 创建工艺路线
     * @param request 包含工艺路线创建信息的请求DTO
     * @return 返回创建成功的工艺路线ID或失败响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping
    public R<Long> create(@Validated @RequestBody CreateRouteRequest request) {
        return routeApplicationService.create(request);
    }

    /**
     * @description 分页查询工艺路线列表（支持条件过滤）
     * @param page 分页参数（页码、每页大小等）
     * @param query 过滤条件（工艺路线编码、状态等）
     * @return 分页的工艺路线列表响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @GetMapping("/list")
    public R<Page<RouteViewPo>> list(
            @ParameterObject Page<RouteViewPo> page,
            @ParameterObject RouteViewPo query) {
        return routeApplicationService.list(page, query);
    }

    /**
     * @description 查询工艺路线详情
     * @param routeId 工艺路线ID
     * @return 返回工艺路线详情或失败响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @GetMapping("/{routeId}")
    public R<RouteViewPo> getById(@PathVariable Long routeId) {
        return routeApplicationService.getById(routeId);
    }

    /**
     * @description 根据状态分页查询工艺路线
     * @param page 分页参数
     * @param status 工艺路线状态
     * @return 分页的工艺路线列表响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @GetMapping("/status/{status}")
    public R<Page<RouteViewPo>> getByStatus(
            @ParameterObject Page<RouteViewPo> page,
            @PathVariable String status) {
        return routeApplicationService.getByStatus(page, status);
    }

    /**
     * @description 更新工艺路线
     * @param routeId 工艺路线ID
     * @param request 包含更新信息的请求DTO
     * @return 返回更新成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PutMapping("/{routeId}")
    public R<Void> update(@PathVariable Long routeId,
                         @Validated @RequestBody UpdateRouteRequest request) {
        return routeApplicationService.update(routeId, request);
    }

    /**
     * @description 启用工艺路线
     * @param routeId 工艺路线ID
     * @return 返回启用成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping("/{routeId}/enable")
    public R<Void> enable(@PathVariable Long routeId) {
        return routeApplicationService.enable(routeId);
    }

    /**
     * @description 禁用工艺路线
     * @param routeId 工艺路线ID
     * @return 返回禁用成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping("/{routeId}/disable")
    public R<Void> disable(@PathVariable Long routeId) {
        return routeApplicationService.disable(routeId);
    }

    /**
     * @description 发布工艺路线
     * @param routeId 工艺路线ID
     * @return 返回发布成功的工艺路线ID或失败响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping("/{routeId}/publish")
    public R<Void> publish(@PathVariable Long routeId) {
        return routeApplicationService.publish(routeId);
    }

    /**
     * @description 归档工艺路线
     * @param routeId 工艺路线ID
     * @return 返回归档成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping("/{routeId}/archive")
    public R<Void> archive(@PathVariable Long routeId) {
        return routeApplicationService.archive(routeId);
    }

    /**
     * @description 分配工艺路线步骤
     * @param routeId 工艺路线ID
     * @param request 包含步骤信息的请求DTO
     * @return 返回添加成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PostMapping("/{routeId}/steps")
    public R<Void> assignProcesses(@PathVariable Long routeId,
                          @Validated @RequestBody RouteAssignProcessesRequest request) {
        return routeApplicationService.assignProcesses(routeId, request);
    }

    /**
     * @description 移除工艺路线步骤
     * @param routeId 工艺路线ID
     * @param request 包含步骤信息的请求DTO
     * @return 返回移除成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @DeleteMapping("/{routeId}/steps")
    public R<Void> removeStep(@PathVariable Long routeId,
                             @Validated @RequestBody RouteRemoveStepRequest request) {
        return routeApplicationService.removeStep(routeId, request);
    }

    /**
     * @description 重新排序工艺路线步骤
     * @param routeId 工艺路线ID
     * @param request 包含新步骤顺序的请求DTO
     * @return 返回重新排序成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PutMapping("/{routeId}/steps/reorder")
    public R<Void> reorderSteps(@PathVariable Long routeId,
                               @Validated @RequestBody RouteReorderStepRequest request) {
        return routeApplicationService.reorderSteps(routeId, request);
    }

    /**
     * @description 更新工艺路线步骤
     * @param routeId 工艺路线ID
     * @param request 包含步骤更新信息的请求DTO
     * @return 返回更新成功或失败的响应
     * @date 2025/7/25 20:01
     * @author dxy
     */
    @PutMapping("/{routeId}/steps")
    public R<Void> updateStep(@PathVariable Long routeId,
                             @Validated @RequestBody RouteStepUpdateRequest request) {
        return routeApplicationService.updateStep(routeId, request);
    }

    /**
     * @description 查询工艺路线的工序列表
     * @param routeId 工艺路线ID
     * @return 返回工序列表或失败响应
     * @date 2025/8/17 20:01
     * @author dxy
     */
    @GetMapping("/{routeId}/processes")
    public R<List<RouteProcessDTO>> getRouteProcesses(@PathVariable Long routeId) {
        return routeApplicationService.getRouteProcesses(routeId);
    }

    /**
     * @description 删除工艺路线
     * @param routeId 工艺路线ID
     * @return 返回删除成功或失败的响应
     * @date 2025/8/17 20:01
     * @author dxy
     */
    @DeleteMapping("/{routeId}")
    public R<Void> delete(@PathVariable Long routeId) {
        return routeApplicationService.delete(routeId);
    }

    /**
     * @description 批量删除工艺路线
     * @param request 包含要删除的工艺路线ID列表的请求DTO
     * @return 返回批量删除成功或失败的响应
     * @date 2025/8/17 20:01
     * @author dxy
     */
    @PostMapping("/batch/delete")
    public R<Void> batchDelete(@Validated @RequestBody RouteBatchDeleteRequest request) {
        return routeApplicationService.batchDelete(request);
    }

    /**
     * @description 获取工艺路线选项（用于下拉选择）
     * @return 返回工艺路线选项列表
     * @date 2025/9/21 20:01
     * @author dxy
     */
    @GetMapping("/options")
    public R<List<OptionDto>> getRouteOptions() {
        return routeApplicationService.getRouteOptions();
    }
}